Jednym z główną rzeczy, na którą należało zwrócić uwagę podczas pracy z udostępnionymi zbiorami danych, jest ich różnorodność. Każdy z zestawów tematycznym charakteryzuje się własną strukturą. Przed wczytaniem zbiorów danych należało uważnie przeanalizować budowę poszczególnego pliku. Również niedogodności jest różnorodność atrybutów czasowych, dla których były zbierane dane. Czas w wybranych zestawach danych był odmierzany każdego dnia, albo z upływem miesiąca, lub roku. Tak różne dziedziny czasu nie można ze sobą połączyć bez wczesniejszej analizy, przez co analiza różnych zbiorów danych staje się nieprzystępna.
Innym problemem widocznym w wielu zestawach danych jest problem wartości pustych. Ich znaczna ilość w wypadku niektórych atrybutów pozbawia sensu brania rzadkich kolumn pod uwagę podczas przeprowadzania jakichkolwiek analiz.
Biblioteki wspomagające wczytywanie i modyfikację danych:
library(dplyr)
library(tidyr)
library(readr)
library(readxl)
library(rmarkdown)
Biblioteki wspomagające wizualizację danych:
library(ggplot2)
library(plotly)
library(corrplot)
Biblioteki użyte podczas uczenia maszynowego:
library(caret)
Poniżej znajdują się sekcje, w których odbywa się wczytywanie poszczególnych zestawów danych. W wybranych przypadkach dane są czyszcone i transformowane do wygodniejszej postaci.
Z pliku data/CurrencyExchangeRates.csv odczytywane są wskaźniki wymiany walut. Wskaźnik mówi ile wart jest jeden dolar amerykański w danej walucie. Podczas wczytywania konieczne jest wskazanie formatu zapisu daty dla kolumny Date. Pozostałe atrybuty są poprawnie automatycznie rozpoznawane jako liczby rzeczywiste.
df_CurrencyExchangeRates <- read_csv(
"data/CurrencyExchangeRates.csv",
col_types = list(Date = col_date(format = "%Y-%m-%d"))
)
Następuje transformacja do dłuższej postaci, gdzie rodzaj waluty jest reprezentowany przez atrybut currency, a wartość jego wskaźnika danego dnia opisana jest w atrybucie rate.
df_CurrencyExchangeRates <- df_CurrencyExchangeRates %>%
pivot_longer(
cols = -Date,
names_to = "currency",
values_to = "rate"
) %>%
mutate(currency = as.factor(currency))
Rozmiar zbioru danych:
## [1] 304878 3
Atrybuty zbioru danych:
## [1] "Date" "currency" "rate"
Statystyki wybranych atrybutów zbioru danych:
## Date currency rate
## Min. :1995-01-02 Algerian Dinar : 5978 Min. : 0.09
## 1st Qu.:2000-10-05 Australian Dollar: 5978 1st Qu.: 1.44
## Median :2006-07-06 Bahrain Dinar : 5978 Median : 5.65
## Mean :2006-07-27 Bolivar Fuerte : 5978 Mean : 485.89
## 3rd Qu.:2012-05-08 Botswana Pula : 5978 3rd Qu.: 57.11
## Max. :2018-05-02 Brazilian Real : 5978 Max. :68827.50
## (Other) :269010 NA's :61189
Plik data/Gold prices.csv zawiera ceny złota podane w trzech walutach dla danego dnia w dwóch porach: przed południem oraz po południu.
df_Gold_prices <- read_csv("data/Gold prices.csv", show_col_types = FALSE)
colnames(df_Gold_prices)
## [1] "Date" "USD (AM)" "USD (PM)" "GBP (AM)" "GBP (PM)" "EURO (AM)"
## [7] "EURO (PM)"
Wyliczona zostaje średnia cena dla danej waluty danego dnia, aby móc analizować wartości z mniejszą dokładnością na poziomie jednego dnia.
df_Gold_prices <- df_Gold_prices %>%
mutate(`USD (MEAN)` = (`USD (AM)` + `USD (PM)`) / 2) %>%
mutate(`GBP (MEAN)` = (`GBP (AM)` + `GBP (PM)`) / 2) %>%
mutate(`EURO (MEAN)` = (`EURO (AM)` + `EURO (PM)`) / 2)
Zbiór danych zostaje przetransformowany: zakodowane w nazwach kolumn rodzaj waluty oraz typ wartości interpretowane są jako osobne atrybuty.
df_Gold_prices <- df_Gold_prices %>%
pivot_longer(
cols = -Date,
names_to = c("currency", "type"), names_pattern = "([A-Z]*) \\(([A-Z]*)\\)",
values_to = "price"
)
Określenie nominalnych typów dla wybranych kolumn.
df_Gold_prices <- df_Gold_prices %>%
mutate(across(c(currency, type), as.factor))
Rozmiar zbioru danych:
## [1] 122265 4
Atrybuty zbioru danych:
## [1] "Date" "currency" "type" "price"
Statystyki atrybutów zbioru danych:
## Date currency type price
## Min. :1968-01-02 EURO:40755 AM :40755 Min. : 14.48
## 1st Qu.:1981-06-10 GBP :40755 MEAN:40755 1st Qu.: 217.67
## Median :1994-11-14 USD :40755 PM :40755 Median : 340.53
## Mean :1994-11-16 Mean : 530.47
## 3rd Qu.:2008-04-23 3rd Qu.: 877.00
## Max. :2021-09-29 Max. :2067.15
## NA's :24204
Wgląd do zbioru danych:
## # A tibble: 122,265 x 4
## Date currency type price
## <date> <fct> <fct> <dbl>
## 1 2021-09-29 USD AM 1742.
## 2 2021-09-29 USD PM 1737.
## 3 2021-09-29 GBP AM 1289.
## 4 2021-09-29 GBP PM 1291.
## 5 2021-09-29 EURO AM 1493.
## 6 2021-09-29 EURO PM 1492.
## 7 2021-09-29 USD MEAN 1739.
## 8 2021-09-29 GBP MEAN 1290.
## 9 2021-09-29 EURO MEAN 1493.
## 10 2021-09-28 USD AM 1740.
## # ... with 122,255 more rows
Informacje wczytane z pliku data/S&P Composite.csv na temat indeksu S&P Composite nie ulegają żadnym wstępnym zmianom.
df_SP_Composite <- read_csv("data/S&P Composite.csv", show_col_types = FALSE)
Rozmiar zbioru danych:
## [1] 1810 10
Atrybuty zbioru danych:
## [1] "Year" "S&P Composite"
## [3] "Dividend" "Earnings"
## [5] "CPI" "Long Interest Rate"
## [7] "Real Price" "Real Dividend"
## [9] "Real Earnings" "Cyclically Adjusted PE Ratio"
Statystyki atrybutów zbioru danych:
## Year S&P Composite Dividend Earnings
## Min. :1871-01-31 Min. : 2.730 Min. : 0.1800 Min. : 0.1600
## 1st Qu.:1908-10-07 1st Qu.: 7.902 1st Qu.: 0.4202 1st Qu.: 0.5608
## Median :1946-06-15 Median : 17.370 Median : 0.8717 Median : 1.4625
## Mean :1946-06-15 Mean : 327.968 Mean : 6.7321 Mean : 15.3714
## 3rd Qu.:1984-02-21 3rd Qu.: 164.400 3rd Qu.: 7.0525 3rd Qu.: 14.7258
## Max. :2021-10-31 Max. :4493.280 Max. :59.6800 Max. :158.7400
## NA's :4 NA's :4
## CPI Long Interest Rate Real Price Real Dividend
## Min. : 6.28 Min. : 0.620 Min. : 73.9 Min. : 5.445
## 1st Qu.: 10.20 1st Qu.: 3.171 1st Qu.: 186.6 1st Qu.: 9.417
## Median : 20.35 Median : 3.815 Median : 283.3 Median :14.411
## Mean : 62.39 Mean : 4.504 Mean : 622.0 Mean :17.498
## 3rd Qu.:102.28 3rd Qu.: 5.139 3rd Qu.: 707.0 3rd Qu.:22.301
## Max. :273.98 Max. :15.320 Max. :4477.2 Max. :63.511
## NA's :4
## Real Earnings Cyclically Adjusted PE Ratio
## Min. : 4.576 Min. : 4.784
## 1st Qu.: 14.063 1st Qu.:11.898
## Median : 23.524 Median :16.381
## Mean : 34.907 Mean :17.215
## 3rd Qu.: 43.768 3rd Qu.:20.913
## Max. :159.504 Max. :44.198
## NA's :4 NA's :120
Wgląd do zbioru danych:
## # A tibble: 1,810 x 10
## Year `S&P Composite` Dividend Earnings CPI `Long Interest Rate`
## <date> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 2021-10-31 3701. NA NA 260. 0.93
## 2 2021-09-30 4493. NA NA 274. 1.29
## 3 2021-08-31 4454. NA NA 274. 1.28
## 4 2021-07-31 4364. NA NA 273. 1.32
## 5 2021-06-30 4238. 57.9 159. 272. 1.52
## 6 2021-05-31 4168. 57.8 149. 269. 1.62
## 7 2021-04-30 4141. 57.7 138. 267. 1.64
## 8 2021-03-31 3911. 57.6 128. 265. 1.61
## 9 2021-02-28 3883. 57.8 117. 263. 1.26
## 10 2021-01-31 3794. 58.1 105. 262. 1.08
## # ... with 1,800 more rows, and 4 more variables: Real Price <dbl>,
## # Real Dividend <dbl>, Real Earnings <dbl>,
## # Cyclically Adjusted PE Ratio <dbl>
W plikach znajdujących się w folderze data/Bitcoin/ dostępne są wybrane cztery statystyki bitcoin’a.
BCHAIN_value_names <- list("DIFF", "HRATE", "MKPRU", "TRVOU")
BCHAIN_filenames <- paste("BCHAIN-", BCHAIN_value_names, ".csv", sep = "")
BCHAIN_pathnames <- paste("data/Bitcoin/", BCHAIN_filenames, sep = "")
dfs_BCHAIN <- lapply(BCHAIN_pathnames, read_csv, show_col_types = FALSE)
Po wczytaniu poszczególnych plików następuje połączenie zbiorów danych do wspólnej relacji opisującej statystyki bitcoin’a dla danego dnia.
for (i in seq_along(BCHAIN_value_names)) {
value_name <- BCHAIN_value_names[[i]]
dfs_BCHAIN[[i]] <- rename(dfs_BCHAIN[[i]], !!value_name := Value)
}
func_BCHAIN_JOIN <- function(...) {
df1 = list(...)[[1]]
df2 = list(...)[[2]]
df_joined = full_join(df1, df2, by = "Date")
return(df_joined)
}
df_BCHAIN <- Reduce(func_BCHAIN_JOIN, dfs_BCHAIN)
Rozmiar zbioru danych:
## [1] 4661 5
Atrybuty zbioru danych:
## [1] "Date" "DIFF" "HRATE" "MKPRU" "TRVOU"
Statystyki atrybutów zbioru danych:
## Date DIFF HRATE MKPRU
## Min. :2009-01-02 Min. :0.000e+00 Min. : 0 Min. : 0.0
## 1st Qu.:2012-03-12 1st Qu.:1.689e+06 1st Qu.: 12 1st Qu.: 7.2
## Median :2015-05-21 Median :4.881e+10 Median : 356089 Median : 431.9
## Mean :2015-05-21 Mean :3.664e+12 Mean : 26458258 Mean : 5141.2
## 3rd Qu.:2018-07-29 3rd Qu.:5.364e+12 3rd Qu.: 38265984 3rd Qu.: 6499.1
## Max. :2021-10-06 Max. :2.505e+13 Max. :198514006 Max. :63554.4
## NA's :1 NA's :2
## TRVOU
## Min. :0.000e+00
## 1st Qu.:1.948e+05
## Median :6.824e+06
## Mean :1.467e+08
## 3rd Qu.:1.484e+08
## Max. :5.352e+09
##
Wgląd do zbioru danych:
## # A tibble: 4,661 x 5
## Date DIFF HRATE MKPRU TRVOU
## <date> <dbl> <dbl> <dbl> <dbl>
## 1 2021-10-05 1.99e13 162177736. 49144. 370887916.
## 2 2021-10-04 1.90e13 147411968. 48206. 183312374.
## 3 2021-10-03 1.90e13 141656680. 47727. 184243788.
## 4 2021-10-02 1.90e13 177543039. 48140. 688291407.
## 5 2021-10-01 1.90e13 132212901. 43758. 360342502.
## 6 2021-09-30 1.90e13 161488615. 41522. 221224597.
## 7 2021-09-29 1.90e13 122769122. 41011. 275833680.
## 8 2021-09-28 1.90e13 143545435. 42238. 249740960.
## 9 2021-09-27 1.90e13 146378569. 43183. 231309917.
## 10 2021-09-26 1.90e13 131268523. 42742. 132297206.
## # ... with 4,651 more rows
W pliku data/World_Development_Indicators.xlsx dostępne są informacje o możliwościach gospodarczych i rozwoju poszczególnych krajów mierzonym przez ponad 100 statystyk.
df_World_Development_Indicators <- read_xlsx(
path = "data/World_Development_Indicators.xlsx",
na = ".."
)
Wczytane dane pochodzą z arkusza kalkulacyjnego. Na jego końcu znajduje się informacja o źródle pochodzenia i dacie utworzenia. Informacje te są widoczne w obiekcie zbioru danych w ostatnich pięciu wierszach, które należy usunąć.
df_World_Development_Indicators <- head(df_World_Development_Indicators, n = -5)
Następuje transformacja wczytanego zioru danych - atrybuty wskazujące rok zostają skondensowane jako atrybut year.
df_World_Development_Indicators <- df_World_Development_Indicators %>%
pivot_longer(
cols = `1970 [YR1970]`:`2020 [YR2020]`,
names_to = "year", names_pattern = "([0-9]*) \\[[0-9A-Z]*\\]",
values_to = "value"
)
Rozmiar zbioru danych:
## [1] 2259504 6
Atrybuty zbioru danych:
## [1] "Country Name" "Country Code" "Series Name" "Series Code" "year"
## [6] "value"
Statystyki atrybutów zbioru danych:
## Country Name Country Code Series Name Series Code
## Length:2259504 Length:2259504 Length:2259504 Length:2259504
## Class :character Class :character Class :character Class :character
## Mode :character Mode :character Mode :character Mode :character
##
##
##
##
## year value
## Length:2259504 Min. :-4.813e+14
## Class :character 1st Qu.: 6.000e+00
## Mode :character Median : 4.100e+01
## Mean : 3.516e+11
## 3rd Qu.: 9.240e+03
## Max. : 1.021e+16
## NA's :1130176
Wgląd do zbioru danych:
## # A tibble: 2,259,504 x 6
## `Country Name` `Country Code` `Series Name` `Series Code` year value
## <chr> <chr> <chr> <chr> <chr> <dbl>
## 1 Afghanistan AFG Urban population gro~ SP.URB.GROW 1970 5.75
## 2 Afghanistan AFG Urban population gro~ SP.URB.GROW 1971 5.86
## 3 Afghanistan AFG Urban population gro~ SP.URB.GROW 1972 5.90
## 4 Afghanistan AFG Urban population gro~ SP.URB.GROW 1973 5.82
## 5 Afghanistan AFG Urban population gro~ SP.URB.GROW 1974 5.63
## 6 Afghanistan AFG Urban population gro~ SP.URB.GROW 1975 5.34
## 7 Afghanistan AFG Urban population gro~ SP.URB.GROW 1976 5.11
## 8 Afghanistan AFG Urban population gro~ SP.URB.GROW 1977 4.85
## 9 Afghanistan AFG Urban population gro~ SP.URB.GROW 1978 4.37
## 10 Afghanistan AFG Urban population gro~ SP.URB.GROW 1979 3.61
## # ... with 2,259,494 more rows
Poniżej przedstawione są podstawowe operacje sprawdzające zawartość danych oraz ich istotne właściwości.
Lista walut wraz z licznikiem wartości pustych:
Wykresy wybranych walut w czasie:
Ograniczenie poglądu do lat 2005-2015, bez waluty Russian Ruble:
Wykres średnich dziennych cen złota w trzech walutach.
Wykres średnich dziennych cen złota w trzech walutach w roku 2019. Wyraźnie widoczna jest pewna korelacja między cenami w różnych walutach. Najprawdopodobniej jest to zgodne z kursami wymian między walutami.
Wykresy wszystkich wartości wszystkich atrybutów danych S&P Composite. W celu uzyskania lepszej czytelności, na poszczególnych wykresach zostały zestawione ze sobą atrybuty, dla których przyjmowane są wartości o podobnym rzędzie wielkości.
Na tle wszystkich atrybutów najbardziej wyróżnia się atrybut Long Interest Rate, którego wykres przyjmuje inne trendy w odróżnieniu od wykresów pozostałych atrybutów.
Poniżej wykresy czterech własności Bitcoin’a (DIFF, HRATE, MKPRU, TRVOU). Widoczne jest ożywienie badanych wartości w roku 2017.
Liczba różnych wartości:
## [1] "Liczba lat, w których zbierane były statystyki: 51"
## [1] "Liczba krajów, dla których zbierane były statystyki: 208"
## [1] "Liczba statystyk, która została uwzględniona w badaniach: 213"
Poniżej w tabeli dla danej statystyki zliczona została liczba wartości pustych.
Dla większości statystyk ponad 25% wartości to wartości puste. Dalsza analiza będzie się opierać na statystykach, dla których zebrano dużo wartości. Wybrane zostają statystyki, które posiadają określone ponad 75% wartości.
Lista krajów, dla których zbierane były statystyki:
Pod atrybutem Country Name kryją się nazwy, które nie odnoszą się do krajów. Są to regiony danego poziomu gospodarczego, dla którego statystyki zostały podsumowane. Tak skumulowane statystyki mogą być znacznie bardziej przydatne, niż statystyki dla pojedynczych krajów. Poniżej lista specjalnych wartości atrybutu Country Name.
Specjalne wartości atrybutu Country Name |
|---|
| Low & middle income |
| Low income |
| Lower middle income |
| Middle income |
| World |
| Upper middle income |
| High income |
Poniżej w tabeli dla danego kraju (podobnie jak wcześniej dla danej statystyki) zliczona została liczba wartości pustych. Po wcześniejszym uprzątnięciu statystyk z wartościami pustymi widać, że pozostawione statystyki dla danego kraju są w większości wypełnione. Tylko dla kilku krajów poziom niewypełnienia danych sięga kilkunastu procent.
Sprawdzenie istnienia korelacji między statystykami dla Polski.
Należy zwrócić uwagę, na atrybuty, które występują ze sobą w silnej korelacji pozytywnej lub negatywnej. W wyraźniejszym wykryciu tych korelacji pomoże zmodyfikowana macierz korelacji, dla której wartości w przyjętym przedziale <-0.9; 0.9> zostaną wyzerowane.
Z powyższego wykresu można odczytać grupę atrybutów na pozycjach 6, 7, 19, 28, 30, 33, 36, 37, 38, 39, które są ze sobą skorelowane. Istnieje też druga grupa atrybutów, które są ze sobą skorelowane pozytywnie, ale za to negatywnie z pierwszą grupą atrybutów. Są to atrybuty na pozycjach 21, 22, 24, 25, 34, 35.
Pierwsza grupa atrybutów:
## [1] "Survival to age 65, female (% of cohort)"
## [2] "Survival to age 65, male (% of cohort)"
## [3] "Population ages 65 and above (% of total population)"
## [4] "Life expectancy at birth, total (years)"
## [5] "GDP per capita (current US$)"
## [6] "GDP (current US$)"
## [7] "CO2 emissions from liquid fuel consumption (kt)"
## [8] "CO2 emissions from liquid fuel consumption (% of total)"
## [9] "CO2 emissions from gaseous fuel consumption (kt)"
## [10] "CO2 emissions from gaseous fuel consumption (% of total)"
Druga grupa atrybutów:
## [1] "Population ages 0-14 (% of total population)"
## [2] "Number of under-five deaths"
## [3] "Mortality rate, infant (per 1,000 live births)"
## [4] "Methane emissions (kt of CO2 equivalent)"
## [5] "CO2 emissions from solid fuel consumption (% of total)"
## [6] "CO2 emissions from solid fuel consumption (kt)"
Naturalną rzeczą wydaje się fakt, że skorelowane ze sobą są: - procent mężczyzn oraz procent kobiet, którzy dożywają wieku 65 lat i powyżej, a także oczekiwana długość życia - liczba zgonów poniżej 5 roku życia i wskaźnik przeżycia dziecka przy porodzie - produkt krajowy brutto dla całego kraju oraz w przeliczeniu na jednego mieszkańca
Również porównując między dwoma grupami atrybutów, uzasadnione jest występowanie korelacji negatywnej między śmiertelnością, a żywotnością.
Poza tymi oczywistymi korelacjami, można natomiast odnaleźć ciekawą zależność między długością życia, bogactwem państwa, a źródłem produkcji gazu CO2. Prawdopodobnie to osiągnięcie długiego wieku życia jest związane z wysokim bogactwem danego państwa (GDP) oraz z używaniem paliw gazowych/płynnych, które są źródłem emisji CO2. Spalanie paliw stałych musi zatem wpływać negatywnie na zdrowie.
Proponowany regresor będzie próbował oszacować wartość złota wyrażoną w dolarach na podstawie obecnych wskaźników wymiany walut.
Przygotowanie zbioru danych - Wybierane są waluty, dla których nie brakuje informacji o wskaźniku wymiany dla więcej niż około 35% wpisów (przyjęto granice 2000 wartości pustych). Dane o cenie złota jest łączona ze wskaźnikami wymiany walut we wspólny zbiór danych reg_data.
reg_Gold_prices <- df_Gold_prices %>%
filter(type == "MEAN", currency == "USD") %>%
select(Date, price) %>%
drop_na()
reg_important_currency <- df_CurrencyExchangeRates_NA_count %>%
filter(`NA counts` < 2000) %>%
select(currency) %>%
pull()
reg_CurrencyExchangeRates <- df_CurrencyExchangeRates %>%
filter(currency %in% reg_important_currency) %>%
pivot_wider(
names_from = currency,
values_from = rate
)
reg_data <- inner_join(reg_Gold_prices, reg_CurrencyExchangeRates, by="Date")
Ustalenie stałej wartości dla źródła liczb losowych - powtarzalność eksperymentu uczenia maszynowego.
set.seed(44)
Podział zbioru na treningowy i testowy
reg_idx_train <- createDataPartition(y = reg_data$price, p = 0.7, list = FALSE)
reg_train <- reg_data[reg_idx_train, ]
reg_test <- reg_data[-reg_idx_train, ]
Schemat uczenia
ctrl <- trainControl(
method = "repeatedcv",
number = 2,
repeats = 5
)
Uczenie
fit <- train(
price ~ .,
data = reg_train,
method = "lm",
trControl = ctrl,
intercept = 0.0,
na.action = na.exclude
)
Podsumowanie wyników uczenia regresora
fit$results
## intercept RMSE Rsquared MAE RMSESD RsquaredSD MAESD
## 1 TRUE 48.28637 0.9841892 36.3396 1.943096 0.001023219 1.248938
summary(fit)
##
## Call:
## lm(formula = .outcome ~ ., data = dat, intercept = 0)
##
## Residuals:
## Min 1Q Median 3Q Max
## -176.196 -27.695 -0.281 25.560 202.646
##
## Coefficients: (7 not defined because of singularities)
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 2.034e+03 8.452e+02 2.406 0.016397 *
## Date 7.377e-02 3.173e-02 2.325 0.020378 *
## `\\`Australian Dollar\\`` 1.025e+03 1.275e+02 8.045 4.30e-15 ***
## `\\`Bahrain Dinar\\`` NA NA NA NA
## `\\`Botswana Pula\\`` -1.167e+03 5.883e+02 -1.984 0.047722 *
## `\\`Brazilian Real\\`` 2.147e+01 1.867e+01 1.150 0.250739
## `\\`Brunei Dollar\\`` -7.058e+02 2.073e+02 -3.405 0.000705 ***
## `\\`Canadian Dollar\\`` 2.382e+02 8.463e+01 2.815 0.005030 **
## `\\`Chilean Peso\\`` -5.712e-01 1.264e-01 -4.518 7.44e-06 ***
## `\\`Chinese Yuan\\`` -1.765e+02 3.280e+01 -5.382 1.04e-07 ***
## `\\`Colombian Peso\\`` 1.139e-01 2.854e-02 3.992 7.33e-05 ***
## `\\`Czech Koruna\\`` -6.729e+00 5.796e+00 -1.161 0.246079
## `\\`Danish Krone\\`` -8.384e+00 5.269e+01 -0.159 0.873618
## Euro -2.824e+02 2.489e+02 -1.135 0.256801
## `\\`Hungarian Forint\\`` 2.421e+00 5.073e-01 4.773 2.26e-06 ***
## `\\`Icelandic Krona\\`` -1.013e+00 4.067e-01 -2.492 0.012966 *
## `\\`Indian Rupee\\`` 1.758e+01 7.499e+00 2.344 0.019397 *
## `\\`Indonesian Rupiah\\`` -1.251e-02 7.776e-03 -1.609 0.108154
## `\\`Iranian Rial\\`` -2.720e-03 1.500e-03 -1.813 0.070286 .
## `\\`Israeli New Sheqel\\`` 1.913e+02 2.539e+01 7.536 1.69e-13 ***
## `\\`Japanese Yen\\`` -6.622e+00 6.192e-01 -10.694 < 2e-16 ***
## `\\`Korean Won\\`` 1.023e-02 7.272e-02 0.141 0.888156
## `\\`Kuwaiti Dinar\\`` -1.420e+03 8.955e+02 -1.586 0.113299
## `\\`Libyan Dinar\\`` -4.863e+02 1.032e+02 -4.711 3.03e-06 ***
## `\\`Malaysian Ringgit\\`` 7.518e+01 3.605e+01 2.085 0.037432 *
## `\\`Nepalese Rupee\\`` -1.559e+01 4.823e+00 -3.233 0.001291 **
## `\\`New Zealand Dollar\\`` 2.289e+01 1.268e+02 0.181 0.856813
## `\\`Norwegian Krone\\`` -2.850e+01 1.594e+01 -1.787 0.074345 .
## `\\`Pakistani Rupee\\`` 5.373e-01 1.150e+00 0.467 0.640610
## `\\`Polish Zloty\\`` -4.815e+00 3.496e+01 -0.138 0.890508
## `\\`Qatar Riyal\\`` NA NA NA NA
## `\\`Rial Omani\\`` NA NA NA NA
## `\\`Saudi Arabian Riyal\\`` NA NA NA NA
## `\\`Singapore Dollar\\`` NA NA NA NA
## `\\`South African Rand\\`` -1.520e+00 5.782e+00 -0.263 0.792677
## `\\`Sri Lanka Rupee\\`` -2.073e+00 7.777e-01 -2.666 0.007884 **
## `\\`Swedish Krona\\`` 8.261e+00 1.586e+01 0.521 0.602662
## `\\`Swiss Franc\\`` -1.893e+02 9.802e+01 -1.932 0.053852 .
## `\\`Thai Baht\\`` 2.650e-01 3.702e+00 0.072 0.942960
## `\\`Trinidad And Tobago Dollar\\`` 2.329e+02 6.026e+01 3.864 0.000123 ***
## `\\`U.A.E. Dirham\\`` NA NA NA NA
## `\\`U.K. Pound Sterling\\`` -4.679e+01 5.473e+01 -0.855 0.392845
## `\\`U.S. Dollar\\`` NA NA NA NA
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 45.52 on 631 degrees of freedom
## Multiple R-squared: 0.9865, Adjusted R-squared: 0.9858
## F-statistic: 1320 on 35 and 631 DF, p-value: < 2.2e-16
predykcja
lrResult <- predict(fit, newdata = reg_test)
length(lrResult)
## [1] 254
length(reg_test$price)
## [1] 1736
Chętnie bym porównał wyniki predykcji wraz rzeczywistymi wartościami. Niestety, niee mam już czasu, żeby przeanalizować, dlaczego liczba zwracanych wyników funkcji predict() różni się od rekordów w zbiorze testowym.